package com.mmall.service;

import com.github.pagehelper.PageInfo;
import com.mmall.common.ServerResponse;
import com.mmall.vo.OrderVo;

import java.util.Map;

/**
 * 订单和支付模块
 */
public interface IOrderService {
    /**
     * 支付接口
     * @param userId 用户id
     * @param orderNo 订单号
     * @param path 付款二维码
     * @return
     */
    ServerResponse pay(Integer userId, Long orderNo, String path);

    /**
     * 第五步：需要严格按照如下描述校验通知数据的正确性。
     * 商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
     * 并判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
     * 同时需要校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方
     * （有的时候，一个商户可能有多个seller_id/seller_email），上述有任何一个验证不通过，则表明本次通知是异常通知，
     * 务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知，正确的进行不同的业务处理，并且过滤重复的通知结果数据。
     * 在支付宝的业务通知中，只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时，支付宝才会认定为买家付款成功。
     * @param params 请求通知数据
     * @return
     */
    ServerResponse aliCallback(Map<String, String> params);

    /**
     * 查询此订单是否为已支付状态
     * @param userId 用户id
     * @param orderNo 订单id
     * @return
     */
    ServerResponse queryOrderPayStatus(Integer userId, Long orderNo);

    /**
     * 创建订单
     * @param userId 用户id
     * @param shippingId 地址id
     * @return
     */
    ServerResponse createOrder(Integer userId, Integer shippingId);

    /**
     * 取消订单
     * @param userId 用户id
     * @param orderNo 订单号
     * @return
     */
    ServerResponse<String> cancelOrder(Integer userId, Long orderNo);

    /**
     * 获取购物车中商品信息
     * @param userId
     * @return
     */
    ServerResponse getOrderCartProduct(Integer userId);

    /**
     * 订单详情
     * @param userId 用户id
     * @param orderNo 订单号
     * @return
     */
    ServerResponse<OrderVo> getOrderDetail(Integer userId, Long orderNo);

    /**
     * 分页展示订单列表
     * @param userId 用户id
     * @return
     */
    ServerResponse<PageInfo> getOrderList(Integer userId,int pageNum,int pageSize);

    //backend

    /**
     * 管理员查看分页订单列表
     * @param pageNum 当前页
     * @param pageSize 每页展示数量
     * @return
     */
    ServerResponse<PageInfo> manageList(int pageNum, int pageSize);

    /**
     * 管理员查看订单详情
     * @param orderNo 订单号
     * @return
     */
    ServerResponse<OrderVo> manageDetail(Long orderNo);

    /**
     * 管理员后台订单号搜索订单
     * @param orderNo 订单号
     * @param pageNum 当前页
     * @param pageSize 每页展示数量
     * @return
     */
    ServerResponse<PageInfo> manageSearch(Long orderNo, int pageNum, int pageSize);

    /**
     * 管理员发货
     * @param orderNo 订单号
     * @return
     */
    ServerResponse<String> manageSendGoods(Long orderNo);
}
